#ifndef _CENTER_BATTLE_LOG_MAMANAGER_H_
#define _CENTER_BATTLE_LOG_MAMANAGER_H_

#include "Resource.h"
#include "ResourceManager.h"
#include "Singleton.h"
#include "String.h"
#include "Database/Field.h"
#include "DataManager.h"

#define DB_NAME_CENTERBATTLELOG		"center_battle_log"

class  Database;
class  CharPtr;
class  ChannelPtr;
class  ItemPtr;
class  WorldPacket;

typedef struct center_battle_log_tag_
{
	uint32 battle_log_id;	//中心组局日志ID
	uint32 group_id;		//服务器组ID
	uint8 status;			//状态
	uint8 type;				//日志类型
	uint8 sub_type;			//日志子类型
	uint32 cb_id;			//组局ID
	uint32 gz_id;			//要创建牌桌的分区ID
	uint32 game_id;			//游戏ID
	
	uint64 club_id;			//俱乐部ID
	uint64 club_room_id;	//俱乐部房间ID
	
	uint32 src_pid;			//日志所属玩家PID
	String user_openid;		//玩家openid
	String user_nick;		//玩家昵称
	String user_ip;			//玩家IP
	String user_addr;		//玩家地址
	
	uint32 data1;			//整型数据1（当前轮次）
	uint32 data2;			//整型数据2
	uint32 data3;			//整型数据3
	uint32 data4;			//整型数据4
	uint32 data5;			//整型数据5
	uint32 data6;			//整型数据6
	uint32 data7;			//整型数据7
	uint32 data8;			//整型数据8
	
	int32 data9;			//整型数据9
	int32 data10;			//整型数据10
	int32 data11;			//整型数据11
	int32 data12;			//整型数据12
	
	float fdata1;			//浮点型数据1
	float fdata2;			//浮点型数据2
	float fdata3;			//浮点型数据3
	float fdata4;			//浮点型数据4
	
	String sdata1;			//字符串型数据1
	String sdata2;			//字符串型数据2
	String sdata3;			//字符串型数据3
	String sdata4;			//字符串型数据4
	String sdata5;			//字符串型数据5
	String sdata6;			//字符串型数据6
	String sdata7;			//字符串型数据7
	String sdata8;			//字符串型数据8
	
	String info;			// 日志描述信息
	String record_data;		// 记录数据
	String create_time;		// 日志创建时间
	
	uint32 update_key;		//数据更新锁
	
	center_battle_log_tag_()
	{
		Init();
	}
	
	void Init()
	{
		battle_log_id = 0;	
		group_id = 0;
		status = 0;	
		type = 0;
		sub_type = 0;
		cb_id = 0;
		gz_id = 0;
		game_id = 0;
		club_id = 0;
		club_room_id = 0;
		
		src_pid = 0;
		
		user_openid = "";
		user_nick = "";
		user_ip = "";
		user_addr = "";
		
		data1 = 0;
		data2 = 0;
		data3 = 0;
		data4 = 0;
		data5 = 0;
		data6 = 0;
		data7 = 0;
		data8 = 0;
		data9 = 0;
		data10 = 0;
		data11 = 0;
		data12 = 0;
		
		fdata1 = 0.0f;
		fdata2 = 0.0f;
		fdata3 = 0.0f;
		fdata4 = 0.0f;
		
		sdata1 = "";
		sdata2 = "";
		sdata3 = "";
		sdata4 = "";
		sdata5 = "";
		sdata6 = "";
		sdata7 = "";
		sdata8 = "";
		
		info = "";
		record_data = "";
		create_time = "";
		
		update_key = 0;
	}
	
}CenterBattleLog;

struct CenterBattlePlayerWinLose
{
	uint8  identity;		// 身份（游戏自己定义，如 地主，农民；庄家，闲家）
	uint32 platform_id;		// 玩家PID
	uint32 char_id;			// 玩家角色ID
	uint32 vip_icon;		// VIP图标
	int winLoseScore;		// 输赢积分
	
	String player_nick;		// 玩家昵称
	String player_desc;		// 玩家头像地址
	String json_data;		// 玩家输赢详细
	
	CenterBattlePlayerWinLose()
	{
		init();
	}
	
	void init()
	{
		identity = 0;
		platform_id = 0;
		char_id = 0;
		vip_icon = 0;
		winLoseScore = 0;
		player_nick = "";
		player_desc = "";
		json_data = "";
	}
};

typedef struct battle_total_log_tag_
{
	uint32 cb_id;			// 组局ID
	uint32 channel_id;		// 牌局ID
	uint32 gz_id;			// 分区ID
	uint32 agent_id;		// 代理商ID
	uint32 game_id;			// 游戏ID
	uint32 zone_id;			// 赛区ID
	uint8 mode;				// 游戏玩法
	
	uint32 owner_pid;		// 房主PID
	uint32 loop_id;			// 轮次ID
	
	uint32 base_coins;		// 底分
	uint32 fan_coins;		// 翻分
	uint32 use_time;		// 牌桌创建时间
	
	uint32 club_id;			// 俱乐部ID
	uint32 club_room_id;	// 俱乐部房间ID
	
	uint32 cm_id;			// 比赛ID
	uint32 jd_id;			// 阶段ID
	
	String room_name;		// 房间名
	String owner_name;		// 房主名
	String owner_head;		// 房主头像
	String extra_data;		// 附加数据（一局详细记录）
	String extra_data2;		// 附加数据2
	String record_data;		// 一轮打牌记录
	
	bool bHaveVedio;		// 是否有录像
	bool bFinal;			// 是否结束
	
	std::vector<CenterBattlePlayerWinLose> player_winLose;	// 所有玩家输赢
	String create_time;	// 创建时间
	
	battle_total_log_tag_()
	{
		Init();
	}
	
	void Init()
	{
		cb_id = 0;
		channel_id = 0;
		gz_id = 0;
		agent_id = 0;
		game_id = 0;
		zone_id = 0;
		mode = 0;
		
		room_name = "";
		owner_pid = 0;
		loop_id = 0;
		
		base_coins = 0;
		fan_coins = 0;
		use_time = 0;
		
		club_id = 0;
		club_room_id = 0;
		cm_id = 0;
		jd_id = 0;
		
		owner_name = "";
		owner_head = "";
		extra_data = "";
		record_data = "";
		extra_data2 = "";
		bHaveVedio = true;
		bFinal = false;
		
		player_winLose.clear();
		
		create_time = "";
	}
	
}BattleTotalLog;

typedef struct coins_loop_log_tag_
{
	uint32 channel_id;		// 牌桌ID
	
	uint32 agent_id;		// 代理商ID
	uint32 game_id;			// 游戏ID
	uint32 gz_id;			// 分区ID
	
	uint32 base_coins;		// 底分
	
	String extra_data;		// 附加数据（一局详细记录）
	String extra_data2;		// 附加数据2
	String record_data;		// 一轮打牌记录
	String game_name;		// 游戏名称
	
	bool bHaveVedio;		// 是否有录像
	std::vector<CenterBattlePlayerWinLose> player_winLose;	// 所有玩家输赢
	
	coins_loop_log_tag_()
	{
		Init();
	}
	
	void Init()
	{
		channel_id = 0;
		agent_id = 0;
		game_id = 0;
		gz_id = 0;
		
		base_coins = 0;
		
		extra_data = "";
		extra_data2 = "";
		record_data = "";
		game_name = "";
		
		bHaveVedio = false;
		
		player_winLose.clear();
	}
	
}CoinsLoopLog;


// 协议返回结果
enum enCBLProtocolsResult
{
	enCBLResult_Failed = 0,		// 失败
	enCBLResult_Sucess = 1,		// 成功
};

// 日志类型定义
enum enCenterBattleLogType
{
	enCenterBattleLogType_PlayerWinLose = 1,	// 玩家输赢记录
	enCenterBattleLogType_BattleTotalInfo = 2,	// 牌局整体记录
	enCenterBattleLogType_CoinsLoopLog = 3,		// 金币场输赢记录
	enCenterBattleLogType_ClubRoomLog = 4,		// 俱乐部房间组局记录
	enCenterBattleLogType_CenterMatchLoopTotalInfo = 5,			// 比赛场每桌组赛记录
	enCenterBattleLogType_CenterMatchPlayerWinLose = 6,		// 比赛输赢
};

// 查询棋牌圈详情结果
enum enQueryCenterBattleDataResult
{
	enQueryCBDResult_Failed = 0,				// 无效的房间号
	enQueryCBDResult_Sucess = 1,				// 查询成功
	enQueryCBDResult_NoThisRoom = 2,			// 未找到该房号的牌桌
	
};

struct stClubHistoryBattlePlayer
{
	uint32 count;			// 局数
	uint32 src_pid;			// 玩家PID
	int32 winLose;			// 输赢分数
	String nick;			// 玩家昵称
	
	stClubHistoryBattlePlayer()
	{
		count = 0;
		src_pid = 0;
		winLose = 0;
		nick = "";
	}
};

struct stClubHistoryBattle
{
	uint32 club_id;			// 俱乐部ID
	uint32 query_time;		// 查询时间（用于判断历史成绩是否需要重新sql）
	uint32 day;				// 查询天数
	uint32 battle_count;	// 游戏局数
	uint32 use_fangka;		// 房卡消耗
	
	std::vector<stClubHistoryBattlePlayer> vPlayers;		// 玩家列表
	
	stClubHistoryBattle()
	{
		query_time = 0;
		day = 0;
		battle_count = 0;
		use_fangka = 0;
		
		vPlayers.clear();
	}
};

#define WGS_CENTERBATTLELOG_MUTEX_NAME cblog_mutex
#define WGS_CENTERBATTLELOG_MUTEX mutable boost::mutex WGS_CENTERBATTLELOG_MUTEX_NAME;
#define WGS_CENTERBATTLELOG_LOCK		boost::lock_guard<boost::mutex> wgsCenterBattleLogMutexLock(WGS_CENTERBATTLELOG_MUTEX_NAME);


//-------------------------组局信息-----------------------
class  SERVER_DECL CenterBattleLogManager:public Singleton<CenterBattleLogManager>
{
public:
	WGS_CENTERBATTLELOG_MUTEX
	CenterBattleLogManager();
	
	/**
	 * @创建时间 2016-07-13
	 * @创建人 Roach
	 * @函数作用 添加一条CenterBattleLog记录
	 * @参数
	 * 	@cbl	CenterBattleLog
	 */
	bool AddCenterBattleLog(CenterBattleLog & cbl);
	
	/**
	 * @创建时间 2016-07-13
	 * @创建人 Roach
	 * @函数作用 更新centerbattlelog
	 * @参数
	 * 	@cbl CenterBattleLog
	 */
	bool UpdateCenterBattleLog(const CenterBattleLog & cbl);
	
	/**
	 * @创建时间 2016-07-13
	 * @创建人 Roach
	 * @函数作用 更新friendrecord数据
	 * @参数
	 * 	@cfr_id	
	 *	@fields	字段键值对,格式：fields["key1"] = 1; fields["key2"] = 2;...
	 */
	bool UpdateCenterBattleLog(Fields * fields, const char * QueryString, ...);
	bool UpdateCenterBattleLog(const uint32 &cbl_id, Fields * fields);
	
	/**
	 * @创建时间 2016-07-13
	 * @创建人 Roach
	 * @函数作用 根据PD_ID获取一条PD数据
	 * @参数
	 *  @cbl_id 	CenterBattleLog id
	 * 	@cbl		CenterBattleLog
	 */
	bool GetCenterBattleLog(const uint32 &cbl_id, CenterBattleLog * cbl);
	
	/**
	 * @创建时间 2016-07-13
	 * @创建人 Roach
	 * @函数作用 获取日志列表
	 * @参数
	 * 	@lstData	CenterBattleLog对象列表
	 *  @query 查询语句条件
	 */
	uint32 GetCenterBattleLogList(std::list<CenterBattleLog> * lstData, const char * query,...);
	
	//========================逻辑操作相关===================================
	// 提交玩家组局游戏日志cb_id 组局ID
	bool CommitCenterBattleLog(CharPtr & pChr, const uint32 & cb_id, Fields & fields);
	
	// 增加组局游戏记录
	bool AddCenterBattleRecordLog(BattleTotalLog btLog, uint8 pos = 0);
	
	// 组局每轮输赢记录
	bool AddCenterBattleLoopWinLoseLog(BattleTotalLog logInfo, uint8 pos = 0);
	
	// 组局整体记录（以一局的一轮为单位存储日志）
	bool AddCenterBattleLoopTotalLog(BattleTotalLog totalLog);
	
	// 俱乐部房间组局记录（将一个房间的N个玩家的数据全部记录在一起）
	bool AddCenterClubRoomBattleLog(BattleTotalLog totalLog);
	
	// 金币场轮次战绩记录
	bool AddCoinsLoopLog(CoinsLoopLog coins_log, uint8 pos = 0);
	
	// 获取玩家牌桌记录
	bool GetPlayerBattleLogs(CharPtr & pChr, const uint32 & cb_id);
	
	// 获取记录条数
	uint32 GetBattleLogsDBCount(const char * QueryString, ...);
	
	// 获取组局牌局记录
	bool GetBattleLogs(CharPtr & pChr, const uint32 & cb_id, const uint32 & offset, const uint32 & num);
	// 获取俱乐部历史战绩
	bool GetClubBattleLogs(CharPtr & pChr, const uint32 & club_id, const uint32 & offset, const uint16 & num);
	// 获得俱乐部周期战绩排名
	bool GetClubBattleHistoryLogs(CharPtr & pChr, const uint32 & club_id, const uint8 & day = 0);
	
	// 获取即时输赢信息
	bool GetCurrentBattleWinLose(CharPtr & pChr, const uint32 & cb_id);
	// 获取组局玩家即时信息
	bool GetCurrentBattlePlayerInfo(CharPtr & pChr, const uint32 & cb_id);
	
	// 获得一轮记录
	bool GetBattleLoopLog(CharPtr & pChr, const uint32 & cb_id, const uint8 & loop);
	// 获得游戏录像
	bool GetBattleVedio(CharPtr & pChr, const uint32 & cb_id, const uint8 & loop);
	// 结束记录用时
	bool CountBattleLogUseTime(const uint32 & cb_id);
	// 查询某局记录
	uint8 QueryCenterBattleLog(String strData, String & extra_data, String & share_info);
	// 获得玩家单局记录列表
	void GetPlayerSingleLogs(CharPtr & pChr, const uint32 & offset, const uint32 & require_count);
	// 得到玩家赛区记录
	void GetPlayerMatchZoneLogs(CharPtr & pChr, const uint32 & zone_id, const uint32 & offset, const uint32 & require_count);

	// 组局每轮输赢记录
	bool AddCenterMatchLoopWinLoseLog(BattleTotalLog logInfo, uint8 pos = 0);

	// 组局整体记录（以一局的一轮为单位存储日志）
	bool AddCenterMatchLoopTotalLog(BattleTotalLog totalLog);

	// 整体记录（以整场为单位存储日志）
	bool AddCenterMatchTotalLog(BattleTotalLog totalLog);
	//========================逻辑操作相关===================================
	
public:
	std::map<uint32, std::vector<stClubHistoryBattle> > m_mapClubBattleHistory;
};

#define	 sCenterBattleLogMgr		 CenterBattleLogManager::getSingleton()


#endif
